home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiscKit1.7.1 / MiscKit / Examples / SearchBench / Timer.m < prev   
Text File  |  1993-10-21  |  7KB  |  205 lines

  1. /*
  2.  *  Copyright (c) 1993 Christopher J. Kane.  All rights reserved.
  3.  *
  4.  *  This software is subject to the terms of the MiscKit license
  5.  *  agreement.  Refer to the license document included with the
  6.  *  MiscKit distribution for these terms.
  7.  *
  8.  *  Version: 1.1 (22 October 1993)
  9.  */
  10.  
  11. #import "Timer.h"
  12.  
  13. // Beware: this code is a mess
  14.  
  15. // The searchFor:... and replaceAll:... method implementations below
  16. // have a few things of note:
  17. //   1. A warmup timing is done, just for the sake of silliness
  18. //   2. The state of the text that needs to be saved in order to
  19. //      restore it after timing the Text class is saved, so that
  20. //      the timing of the Misc_TBMK routines and friends happens
  21. //      under nearly the same conditions
  22. //   3. Searches/replaces are done for the literal string of a
  23. //      regular expression in the Text object searching when a
  24. //      regular expression is provided.
  25.  
  26. #define WALLTIME(T1, T2) ((1000000*(T2.tv_sec-T1.tv_sec)+T2.tv_usec-T1.tv_usec)/1000)
  27. #define PROCTIME(U1, U2) ((1000000*(U2.ru_utime.tv_sec-U1.ru_utime.tv_sec)+\
  28.     U2.ru_utime.tv_usec-U1.ru_utime.tv_usec+1000000*(U2.ru_stime.tv_sec-\
  29.     U1.ru_stime.tv_sec)+U2.ru_stime.tv_usec-U1.ru_stime.tv_usec)/1000)
  30.  
  31. @implementation Timer
  32.  
  33. - init
  34. {
  35.   int i;                // calibrate a bit
  36.   struct rusage usage1, usage2;
  37.   struct timeval t1, t2;
  38.   gettimeofday(&t1, 0);            // just done for "warmup" purposes
  39.   getrusage(RUSAGE_SELF, &usage1);
  40.   [self self];                // get crude estimate of method call time
  41.   getrusage(RUSAGE_SELF, &usage2);
  42.   gettimeofday(&t2, 0);
  43.   wallcallms = 0;
  44.   proccallms = 0;
  45.   NXPing();                // why not?
  46.   for (i=0; i<25; i++)
  47.     {
  48.       gettimeofday(&t1, 0);
  49.       getrusage(RUSAGE_SELF, &usage1);
  50.       [self self];
  51.       getrusage(RUSAGE_SELF, &usage2);
  52.       gettimeofday(&t2, 0);
  53.       wallcallms += WALLTIME(t1, t2);
  54.       proccallms += PROCTIME(usage1, usage2);
  55.     }
  56.   wallcallms /= 25000;
  57.   proccallms /= 25000;
  58.   return self;
  59. }
  60.  
  61. - (oneway void)makeSelectionVisible
  62. {
  63.   [textObj makeSelectionVisible];
  64. }
  65.  
  66. - (oneway void)replaceSelection:(const char *)replacement
  67. {
  68.   [textObj replaceSelection:replacement];
  69. }
  70.  
  71. - (oneway void)selectTextFrom:(int)start to:(int)end
  72. {
  73.   [textObj selectTextFrom:start to:end];
  74. }
  75.  
  76. - (void)writeSelectionToPasteboard:(in Pasteboard *)pboard asType:(in NXAtom)type
  77. {
  78.   [textObj writeSelectionToPasteboard:pboard asType:type];
  79. }
  80.  
  81. - (int)replaceAll:(const char *)pattern with:(const char *)replacement mode:(SearchMode)mode regexpr:(BOOL)regexpr cases:(BOOL)cases
  82. {
  83.   char buffer[1024];
  84.   int r, count=0, end;
  85.   NXSelPt sp0, spN;
  86.   struct rusage usage1, usage2;
  87.   struct timeval t1, t2;
  88.   NXStream *strm;
  89.  
  90.   strm = NXOpenMemory(NULL, 0, NX_READWRITE);
  91.   [textObj writeText:strm];        // save original text
  92.   NXSeek(strm, 0, NX_FROMSTART);
  93.   NXPing();
  94.   gettimeofday(&t1, 0);            // just done for "warmup" purposes
  95.   getrusage(RUSAGE_SELF, &usage1);
  96.   [textObj self];
  97.   getrusage(RUSAGE_SELF, &usage2);
  98.   gettimeofday(&t2, 0);
  99.  
  100.   [textObj getSel:&sp0 :&spN];
  101.   [messageField setStringValue:"Timing Text class..."];
  102.   [textObj getSel:&sp0 :&spN];
  103.   [[textObj window] disableDisplay];    // don't draw (and slow things down)
  104.   NXPing();
  105.   gettimeofday(&t1, 0);            // time the Text class
  106.   getrusage(RUSAGE_SELF, &usage1);
  107.   if (mode==TextEdgeToTextEdge)
  108.     {
  109.       [textObj setSel:0 :0];        // start at the very beginning...
  110.         while ([textObj findText:pattern ignoreCase:!cases backwards:NO wrap:NO])
  111.           {    // findText:... does the selecting for us, and
  112.         // takes care of the end point
  113.             [textObj replaceSel:replacement];
  114.             count++;
  115.           }
  116.     }
  117.   else if (mode== SelStartToSelEnd)
  118.     {
  119.       end = spN.cp-strlen(pattern);
  120.       [textObj setSel:sp0.cp :sp0.cp];
  121.       while ([textObj findText:pattern ignoreCase:!cases backwards:NO wrap:NO])
  122.         {    // here, the we need to keep track of the end position
  123.           if (sp0.cp>end) break;
  124.           [textObj replaceSel:replacement];
  125.           end += strlen(replacement)-strlen(pattern);
  126.           count++;
  127.         }
  128.     }
  129.   getrusage(RUSAGE_SELF, &usage2);
  130.   gettimeofday(&t2, 0);
  131.   [[textObj window] reenableDisplay];
  132.   [[textObj window] display];
  133.   [textWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
  134.   [textProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
  135.   [messageField setStringValue:"One moment..."];
  136.   NXPing();
  137.   [textObj readText:strm];        // restore original text
  138.   [textObj setSel:sp0.cp :spN.cp];    // restore original selection
  139.  
  140.   [messageField setStringValue:"Timing Misc_TBMK routines..."];
  141.   NXPing();
  142.   gettimeofday(&t1, 0);                // time the Misc_TBMK routines
  143.   getrusage(RUSAGE_SELF, &usage1);
  144.   r = [textObj replaceAll:pattern with:replacement mode:mode regexpr:regexpr cases:cases];
  145.   getrusage(RUSAGE_SELF, &usage2);
  146.   gettimeofday(&t2, 0);
  147.   [tbmkWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
  148.   [tbmkProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
  149.  
  150.   sprintf(buffer, "replaceAll:\"%s\" with:\"%s\" mode:%s regexpr:%s cases:%s", pattern, replacement,
  151.      (mode==TextEdgeToTextEdge?"TextEdgeToTextEdge":
  152.           mode==SelStartToSelEnd?"SelStartToSelEnd":"Other"),
  153.      (regexpr?"YES":"NO"), (cases?"YES":"NO"));
  154.   [messageField setStringValue:buffer];
  155.   NXCloseMemory(strm, NX_FREEBUFFER);
  156.   return r;
  157. }
  158.  
  159. - (int)searchFor:(const char *)pattern mode:(SearchMode)mode reverse:(BOOL)rev regexpr:(BOOL)regexpr cases:(BOOL)cases position:(out int *)pos size:(out int *)size
  160. {
  161.   char buffer[1024];
  162.   int r;
  163.   NXSelPt sp0, spN;
  164.   struct rusage usage1, usage2;
  165.   struct timeval t1, t2;
  166.  
  167.   [textObj getSel:&sp0 :&spN];
  168.   NXPing();
  169.   gettimeofday(&t1, 0);            // just done for "warmup" purposes
  170.   getrusage(RUSAGE_SELF, &usage1);
  171.   [textObj self];
  172.   getrusage(RUSAGE_SELF, &usage2);
  173.   gettimeofday(&t2, 0);
  174.  
  175.   [messageField setStringValue:"Timing Text class..."];
  176.   NXPing();
  177.   gettimeofday(&t1, 0);            // time the Text class
  178.   getrusage(RUSAGE_SELF, &usage1);
  179.   [textObj findText:pattern ignoreCase:!cases backwards:rev wrap:YES];
  180.   getrusage(RUSAGE_SELF, &usage2);
  181.   gettimeofday(&t2, 0);
  182.   [textWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
  183.   [textProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
  184.   [textObj setSel:sp0.cp :spN.cp];    // restore original selection
  185.  
  186.   [messageField setStringValue:"Timing Misc_TBMK routines..."];
  187.   NXPing();
  188.   gettimeofday(&t1, 0);            // time the Misc_TBMK routines
  189.   getrusage(RUSAGE_SELF, &usage1);
  190.   r = [textObj searchFor:pattern mode:mode reverse:rev regexpr:regexpr cases:cases position:pos size:size];
  191.   getrusage(RUSAGE_SELF, &usage2);
  192.   gettimeofday(&t2, 0);
  193.   [tbmkWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
  194.   [tbmkProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
  195.  
  196.   sprintf(buffer, "searchFor:\"%s\" mode:%s reverse:%s regexpr:%s cases:%s pos:size:", pattern,
  197.    (mode==SelEndToSelStart?"SelEndToSelStart":
  198.         mode==SelStartToSelEnd?"SelStartToSelEnd":"Other"),
  199.    (rev?"YES":"NO"), (regexpr?"YES":"NO"), (cases?"YES":"NO"));
  200.   [messageField setStringValue:buffer];
  201.   return r;
  202. }
  203.  
  204. @end
  205.